__DefBitFieldType SReg<8>
    SR_LANEID;
    // SR_THREADID; // 1d threadIdx = warpid*32+laneid;

    SR_EQMASK;
    SR_LTMASK;
    SR_LEMASK;
    SR_GTMASK;
    SR_GEMASK;

    SR_WARPID;
    SR_TEID;
    SR_TCID;
    SR_PHYTCID; //
    SR_PHYWARPID; //

    SR_CTAID.X;
    SR_CTAID.Y;
    SR_CTAID.Z;

    SR_PM0;
    SR_PM1;
    SR_PM2;
    SR_PM3;
    SR_PM4;
    SR_PM5;
    SR_PM6;
    SR_PM7;
    SR_PM_HI0;
    SR_PM_HI1;
    SR_PM_HI2;
    SR_PM_HI3;
    SR_PM_HI4;
    SR_PM_HI5;
    SR_PM_HI6;
    SR_PM_HI7;

    SR_LWINHI;  // ???
    SR_LWINLO;
    SR_LWINSZ;

    SR_SWINHI;
    SR_SWINLO;
    SR_SMEMSZ;

    // SR_CLOCK;
    SR_CLOCKLO;
    SR_CLOCKHI;
    SR_GLOBALTIMELO;
    SR_GLOBALTIMEHI;

    SR_REGALLOC;
    // SR_BARALLOC ???

    SR_GLOBALERRORSTATUS;
    SR_WARPERRORSTATUS;

    // TODO: ...
    SRZ = 0xff;


__DefGroup MISC : [ALL]
  __Encoding
    field<12, 3> Pred pg=PT;
    field<15, 1> PModi pg.not=False;

__DefOptype S2R : [MISC]
  __Encoding
    field<0,  8> Optype optype ==S2R;
    field<16, 8> Reg rd;
  
  __Syntax
```asm          
S2R Rd, SRa      $sched $req $wsb ;
```

  __Description
将特殊寄存器SRa的值精确复制给通用寄存器Rd。

  __OperandInfo
Rd必须来源于GPR，位宽只能是32bit。

源操作数SRa必须是一个32bit特殊寄存器（Special Register）。

关于特殊寄存器的更多信息，请参考[特殊寄存器操作数](操作数汇编显示规则.md#特殊寄存器操作数)。

  __Semantics
```asm
S2R Rd, SRa:
    Rd = SRa;
```

  __Examples
```asm
S2R R1, SR_LANEID ;   // R1 = SR_LANEID，获取当前thread在warp中的索引
S2R R2, SR_CTAID  ;   // R2 = SR_CTAID，获取当前CTA的索引
```

__DefOpcode S2R_I : [S2R]
  __Encoding
    field<8,  4> SType stype==I;
    field<32, 8> SReg sreg;
  __OperandInfo
    InList<pg>;
    OutList<rd>;
    Order<pg, rd, sreg>;
    Bitwidth<rd> = 32; // TODO

__DefOptype CS2R : [MISC]
  __Encoding
    field<0,  8> Optype optype ==CS2R;
    field<16, 8> Reg rd;

  __Syntax
```asm          
CS2R Rd, SRa      $sched $req $wsb ;
```

  __Description
将特殊寄存器SRa的值精确复制给通用寄存器Rd。

Rd和SRa都必须是64bit位宽的寄存器。

  __OperandInfo
Rd必须来源于GPR，位宽是64bit。

关于如何表示64bit位宽的寄存器，可以参考[扩展位宽的寄存器操作数](操作数汇编显示规则.md#扩展位宽的寄存器操作数)。

源操作数SRa必须是一个64bit特殊寄存器（Special Register），例如SR_CLOCK。

关于特殊寄存器的更多信息，请参考[特殊寄存器操作数](操作数汇编显示规则.md#特殊寄存器操作数)。

  __Semantics
```asm
CS2R Rd, SRa:
    Rd = SRa;
```

  __Examples
```asm
CS2R R[0:1], SR_CLOCK ;   // R[0:1] = SR_CLOCK，获取当前thread所在的硬件时钟cycle数
```

__DefOpcode CS2R_I : [CS2R]
  __Encoding
    field<8,  4> SType stype==I;
    field<32, 8> SReg sreg;
  __OperandInfo
    InList<pg>;
    OutList<rd>;
    Order<pg, rd, sreg>;
    Bitwidth<rd> = 64; // TODO

__DefOptype S2UR : [MISC]
  __Encoding
    field<0,  8> Optype optype ==S2UR;
    field<16, 6> UReg urd;

  __Syntax
```asm          
S2UR URd, SRa      $sched $req $wsb ;
```

  __Description
将特殊寄存器SRa的值精确复制给Uniform寄存器URd。

  __OperandInfo
URd必须来源于UR，位宽只能是32bit。

源操作数SRa是32bit特殊寄存器（Special Register），且必须是对同一warp内所有thread一致的（warp uniform），例如SR_CTAID。

关于特殊寄存器的更多信息，请参考[特殊寄存器操作数](操作数汇编显示规则.md#特殊寄存器操作数)。

  __Semantics
```asm
S2UR URd, SRa:
    URd = SRa;
```

  __Examples
```asm
S2UR UR2, SR_CTAID  ;   // UR2 = SR_CTAID，获取当前CTA的索引
```

__DefOpcode S2UR_I : [S2UR]
  __Encoding
    field<8,  4> SType stype==I;
    field<32, 8> SReg sreg;
  __OperandInfo
    InList<pg>;
    OutList<urd>;
    Order<pg, urd, sreg>;
    Bitwidth<urd> = 32; // TODO

__DefOptype PMTRIG : [MISC]
  __Encoding
    field<0,  8> Optype optype==PMTRIG;

__DefOpcode PMTRIG_I : [PMTRIG]
  __Encoding
    field<8,  4> SType stype == I;
    field<32, 16> UImm16 vb;
  __OperandInfo
    InList<pg>;
    OutList<>;
    Order<pg, vb>;
    Bitwidth<vb> = 16; // TODO

__DefOptype SETREG : [MISC]
  __Encoding
    field<0,  8> Optype optype == SETREG;
    field<24, 8> Reg ra;

  __Syntax
```asm          
SETREG SrcAddr, Ra      $sched $req $wsb ;
```

  __Description
将指定地址的特殊寄存器（Special Register）值设置为输入寄存器Ra的值。

  __OperandInfo
Ra必须来源于GPR，表示要赋予目的寄存器的值。

SrcAddr的合法来源包括GPR、UR或UImm32，是一个输入的32bit无符号数，表示要设置的特殊寄存器的地址。

  __Semantics
```asm
SETREG SrcAddr, Ra:
    *(SrcAddr) = Ra;
```

  __Examples
```asm
SETREG 0x0000FFFF, R0;
SETREG        R13, R0;
```

__DefOpcode SETREG_RI : [SETREG]
  __Encoding
    field<8,  4> SType stype==RI;
    field<32,32> UImm32 regaddr;
  __OperandInfo
    InList<pg, ra>;
    OutList<>;
    Order<pg, regaddr, ra>;
    Bitwidth<ra> = 32; // TODO: 64bit??

__DefOpcode SETREG_RR : [SETREG]
  __Encoding
    field<8,  4> SType stype==RR;
    field<32, 8> Reg rb;
  __OperandInfo
    InList<pg, ra, rb>;
    OutList<>;
    Order<pg, rb, ra>;
    Bitwidth<ra> = 32; // TODO: 64bit??
    Bitwidth<rb> = 32;

__DefOpcode SETREG_RU : [SETREG]
  __Encoding
    field<8,  4> SType stype==RU;
    field<32, 6> UReg urb;
  __OperandInfo
    InList<pg, ra, urb>;
    OutList<>;
    Order<pg, urb, ra>;
    Bitwidth<ra> = 32; // TODO: 64bit??
    Bitwidth<urb> = 32;

__DefOptype GETREG : [MISC]
  __Encoding
    field<0,  8> Optype optype == GETREG;
    field<16, 8> Reg rd;

  __Syntax
```asm          
GETREG Rd, SrcAddr      $sched $req $wsb ;
```

  __Description
将指定地址的特殊寄存器（Special Register）值拷贝给寄存器Rd。

  __OperandInfo
Rd必须来源于GPR，表示拷贝的目的寄存器。

SrcAddr的合法来源包括GPR、UR或UImm32，是一个输入的32bit无符号数，表示要设置的特殊寄存器的地址。

  __Semantics
```asm
GETREG Rd, SrcAddr:
    Rd = *(SrcAddr);
```

  __Examples
```asm
GETREG R0, 0x0000FFFF;
GETREG R0,         R7;
```

__DefOpcode GETREG_I : [GETREG]
  __Encoding
    field<8,  4> SType stype==I;
    field<32,32> UImm32 regaddr;
  __OperandInfo
    InList<pg>;
    OutList<rd>;
    Order<pg, rd, regaddr>;
    Bitwidth<rd> = 32; // TODO

__DefOpcode GETREG_R : [GETREG]
  __Encoding
    field<8,  4> SType stype==R;
    field<32, 8> Reg rb;
  __OperandInfo
    InList<pg, rb>;
    OutList<rd>;
    Order<pg, rd, rb>;
    Bitwidth<rd> = 32;
    Bitwidth<rb> = 32;

__DefOpcode GETREG_U : [GETREG]
  __Encoding
    field<8,  4> SType stype==U;
    field<32, 6> UReg urb;
  __OperandInfo
    InList<pg, urb>;
    OutList<rd>;
    Order<pg, rd, urb>;
    Bitwidth<rd> = 32;
    Bitwidth<urb> = 32;

__DefOptype SWITCH : [MISC]
  __Encoding
    field< 0,  8> Optype optype == SWITCH;

__DefOpcode SWITCH_R : [SWITCH]
  __Encoding
    field< 8,  4> SType stype==R;
    field<32,  8> Reg rb;
  __OperandInfo
    InList<pg, rb>;
    OutList<>;
    Order<pg, rb>;
    Bitwidth<rb> = 32;

__DefOpcode SWITCH_C : [SWITCH]
  __Encoding
    field< 8,  4> SType stype==C;
    field<32, 22> CMem vb;
  __OperandInfo
    InList<pg, vb>;
    OutList<>;
    Order<pg, vb>;
    Bitwidth<vb> = 32;

__DefOpcode SWITCH_I : [SWITCH]
  __Encoding
    field< 8,  4> SType stype==I;
    field<32, 32> UImm32 hidx;
  __OperandInfo
    InList<pg>;
    OutList<>;
    Order<pg, hidx>;
    Bitwidth<hidx> = 32;

__DefGroup IB : [ALL]
  __Encoding
    field<12, 3> Pred pg=PT;
    field<15, 1> PModi pg.not=False;

__DefOptype NOP : [IB]
  __Encoding
    field<0,  8> Optype optype==NOP;

__DefOpcode NOP_X : [NOP]
  __Encoding
    field<8,  4> SType stype==X;
  __OperandInfo
    InList<pg>;
    OutList<>;
    Order<pg>;

__DefOptype IBBAR : [IB]
  __Encoding
    field<0,  8> Optype optype==IBBAR;

__DefOpcode IBBAR_X : [IBBAR]
  __Encoding
    field<8,  4> SType stype==X;
  __OperandInfo
    InList<pg>;
    OutList<>;
    Order<pg>;

__DefOptype DEPBAR : [IB]
  __Encoding
    field<0,  8> Optype optype==DEPBAR;

__DefOpcode DEPBAR_I : [DEPBAR]
  __Encoding
    field<8,  4> SType stype==I;

    field<32, 3> UImm3 sbid;
    field<36, 8> UImm8 cnt;

  __OperandInfo
    InList<pg>;
    OutList<>;
    Order<pg, sbid, cnt>;
    Bitwidth<sbid> = 3;
    Bitwidth<cnt> = 8;
